package file

import (
	"io"
	"net/http"

	"gitee.com/kitfast/letsgo/io/coreio"
)

// 使用 HTTP 获取指定 url 的内容，返回一个只读流。
// 如果请求出错则返回该错误；如果状态码不是 2xx，则返回 ErrHttpStatus 错误；如果只读流为 nil，则返回 coreio.ErrNilReader 错误。
// 只要出错，则返回的 io.ReadCloser 为 nil。
func HttpGet(url string, headers http.Header) (io.ReadCloser, error) {
	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		return nil, err
	}
	if len(headers) > 0 {
		for key, values := range headers {
			for _, value := range values {
				req.Header.Add(key, value)
			}
		}
	}
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	if res.StatusCode < 200 || res.StatusCode >= 300 {
		return nil, ErrHttpStatus
	}
	if res.Body == nil {
		return nil, coreio.ErrNilReader
	}
	return res.Body, nil
}

// 使用 HTTP 获取指定 url 的内容，调用 call 函数，最后关闭响应中的 body。
func HttpGetThen(url string, headers http.Header, call func(body io.ReadCloser) error) error {
	body, err := HttpGet(url, headers)
	if err != nil {
		return err
	}
	defer body.Close()
	return call(body)
}

// 使用 HTTP 获取指定 url 的内容，调用 write 函数，最后关闭响应中的 body。
func HttpGetThenWrite(url string, headers http.Header, write func(body io.ReadCloser) (int64, error)) (int64, error) {
	body, err := HttpGet(url, headers)
	if err != nil {
		return 0, err
	}
	defer body.Close()
	return write(body)
}

// 下载 url 指定的内容并保存到文件，如果文件不存在，则创建；如果存在，则清空原文件后写入。
func Download(name, url string, headers http.Header) (int64, error) {
	return HttpGetThenWrite(url, headers, func(body io.ReadCloser) (int64, error) { return WriteFrom(name, body) })
}
